package persistencia.busqueda;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import negocio.busqueda.Perfil;
import negocio.cv.Exigencia;
import persistencia.DACBase;
import persistencia.SingletonDACBase;
import persistencia.cliente.DACExigencia;

public class DACExigenciaPerfil extends DACBase {
	
	private Exigencia exigencia;

	private List<Exigencia> exigencias;
	private CallableStatement clstm;
	private ResultSet rs;
	
	
	
	public DACExigenciaPerfil(DACBase dacBase) {
		super(dacBase);
		// TODO Auto-generated constructor stub
	}

	/**
	 * Estos metodos actualizar toman la lista de objetos a modificar
	 * y crea a quellos que anteriormente no existian, modifica los que 
	 * ya exiatian y vuelven de nuevo
	 * y borra aquellos que fueron eliminados  
	 * @param perfil
	 */
	public void actualizarExigenciasDelPerfil(Perfil perfil) {		
		try{					
			List<Exigencia> exigenciasAmodificar = consultarExigenciasDelPerfil(perfil.getIdPerfil());
			
			for (Exigencia exigencia : perfil.getExigencias()) {				
				clstm = getConn().prepareCall("{call save_exigenciadelperfil(?,?)}");
				clstm.setInt("idperfil", perfil.getIdPerfil());
				clstm.setInt("idexigencia", exigencia.getIdExigencia());
				clstm.execute();	
				
				if (exigenciasAmodificar.indexOf(exigencia) != -1) {				
					exigenciasAmodificar.remove(exigencia);
				}
			}  
			
			for (Exigencia exigencia : exigenciasAmodificar) {				
				eliminarExigenciaDelPerfil(exigencia, perfil.getIdPerfil());
			}
			if(clstm != null)
				clstm.close();
	        clstm = null;       
	       
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo altaExigenciasDelPerfil_DacEigencia");
		}	
	}
	
	public void eliminarExigenciaDelPerfil(Exigencia e, int idPerfil) {		
		try{	
			
			clstm = getConn().prepareCall("{call delete_exigenciadelperfil(?,?)}");				
			clstm.setInt("par_idperfil",idPerfil);
			clstm.setInt("par_idexigencia", e.getIdExigencia());
			clstm.execute();				
				
			if(clstm != null)
				clstm.close();
	        clstm = null;
	              	            
	        
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo eliminarExigenciasDelPerfil_DacEigencia");
		}
	}

	public List<Exigencia> consultarExigenciasDelPerfil(int idPerfil) {
		exigencias = new ArrayList<Exigencia>();		
		try{
			clstm = getConn().prepareCall("{call exigenciaxperfilConsultar(?)}"); 
			clstm.setInt("idperfil", idPerfil);
			clstm.execute();
			rs = clstm.getResultSet();			
			while (rs.next()) {
				
				DACExigencia dacE = new DACExigencia(SingletonDACBase.tomarDACBase());
				exigencia = dacE.consultarExigencia(rs.getInt("idexigencia"));				
				
				exigencias.add(exigencia);
			}			
			
			rs.close();
			rs = null;
			clstm.close();
            clstm = null;
            
          
            
		}    
		catch (SQLException ex) {
		    // handle any errors
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo consultarExigenciasDelPerfil()_DACExigencia");
			}
		
	    return exigencias;	
	}
}
